// 防抖
// 在事件被触发n秒后再执行回调，如果在这n秒内又被触发，则重新计时。
export function _debounce (fn, delay) {
  delay = delay || 200
  var timer
  // console.log(delay)
  return function () {
    var th = this
    var args = arguments
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(function () {
      timer = null
      fn.apply(th, args)
    }, delay)
  }
}
// 节流
// 规定在一个单位时间内，只能触发一次函数。如果这个单位时间内触发多次函数，只有一次生效。
export function _throttle (fn, interval) {
  var last
  var timer
  interval = interval || 200
  return function () {
    var th = this
    var args = arguments
    var now = +new Date()
    if (last && now - last < interval) {
      clearTimeout(timer)
      timer = setTimeout(function () {
        last = now
        fn.apply(th, args)
      }, interval)
    } else {
      last = now
      fn.apply(th, args)
    }
  }
}
export function debounce (func, wait, immediate, that) {
  return () => {
    let context = that
    let args = arguments
    // console.log(that)
    if (that.timeout) clearTimeout(that.timeout)
    if (immediate) {
      let callNow = !that.timeout
      that.timeout = setTimeout(function () {
        that.timeout = null
      }, wait)
      if (callNow) func.apply(context, args)
    } else {
      that.timeout = setTimeout(function () {
        func.apply(context, args)
      }, wait)
    }
  }
}
export default {_debounce, _throttle}
